//LiteXLoader Dev Helper
/// <reference path="c:\Users\Yoyo\.vscode\extensions\moxicat.lxldevhelper-0.1.4/Library/JS/Api.js" /> 


/**
 * 插件名: 新锁箱子(New lock box)
 * 作者:Yoyo
 * 版本: 0.0.1
 * 创作日期: 2022-1-9 14:30
 * 群号: 363457102
 * 介绍: 这是一个多功能的锁箱子 它支持的功能 比较多 此次才用面向对象方式写法 ,优化方法,和良好的日志文件!
 */

/**
 * 定义箱子结构
 */
 var boxJson = {
    title:"我是箱子",

};

/**
 * 功能类
 */
class Func {
    static CurrentDate = '';//当前记录日期

    /**
     * 判断当前日期是否变动 变动就设置日志位置
     */
    static setLogFile() {
        if (Func.getCurrentDate() != Func.CurrentDate) {
            logger.setFile(`${PATH}\\logs\\${Func.getCurrentDate()}.log`);
        }
    }

    /**
     * 获取当前年月日
     * @returns 当前日期 Y-m-d
     */
    static getCurrentDate() {
        let dateTimeObject = system.getTimeObj();
        return `${dateTimeObject.Y}-${dateTimeObject.M}-${dateTimeObject.D}`;
    }
    /**
     * 获取两个坐标直线距离
     * @param {IntPos} posA 
     * @param {IntPos} posB 
     * @returns {Boolean} 如果同纬度 就返回距离 不是的话返回 false
     */
    static getPosDistance(posA, posB) {
        if (posA.dimid == posB.dimid) {
            let dx = posA.x - posB.x;
            let dy = posA.y - posB.y
            let dz = posA.z - posB.z;
            let ams = (dx * dx) + (dy * dy) + (dz * dz);
            return Math.sqrt(ams);
        }
        return false;
    }
    /**
     * 判断玩家余额是否满足
     * @param {player} player 玩家对象
     * @param {Number} num 金额数量
     * @returns {Object} {status:(true满足 false不满足),num:(差多少)}
     */
    static isMoney(player,num){
        let balance = 0;
        let moneyConfig = CONFIG.get("money");
        if(moneyConfig.isLLmoney){
            balance = money.get(player.xuid);
            return {
                status:(balance>=num?true:false),
                num:(num-balance)
            };
        }
        balance = player.getScore(moneyConfig.socre);
        return {
            status:(balance>=num?true:false),
            num:(num-balance)
        };
    }
    /**
     * 更新玩家金额
     * @param {player} player 玩家对象
     * @param {Number} num 金额数量
     * @param {Boolean} type true是增加 false是减少 (默认true)
     * @returns {Boolean} 操作结果
     */
    static upDateMonry(player,num,type = true){
        let moneyConfig = CONFIG.get("money");
        if(moneyConfig.isLLmoney){
            return type?money.add(player.xuid,num):money.reduce(player.xuid,num);
        }
        return type?player.addScore(moneyConfig.socre,num):player.reduceScore(moneyConfig.socre,num);
    }
}

/**
 * 主类
 */
class LockBox {
    tickCount = 0;//记录tick数量
    passMinuteCheckDate = 10;//默认10分钟检测一次

    constructor() {
        Func.setLogFile();
    }

    //监听事件
    /**
     * 每个Tick执行
     */
    onTick() {
        if (this.tickCount > (1200 * this.passMinuteCheckDate)) {
            Func.setLogFile();//检测日期并设置
            this.tickCount = 0;//重新计算
            return false;
        }
        this.tickCount++;//否则就继续计数
    }
    /**
     * 服务器启动完成
     */
    onServerStarted() {
        if(isVersioning){
            //检测自动更新
            versioning({
                name:'NewLockBox.lxl.js',
                url:"https://gitee.com/Y_oyo/yoyo-mcbe-lite-xloader-item/raw/master/LXLJS/",
                v:'0.01',
                configUrl:"https://gitee.com/Y_oyo/yoyo-mcbe-lite-xloader-item/raw/master/versioning.json",
                title:"NewLockBox"
            });
         }
        
    }
    /**
     * 玩家破坏方块完成
     * @param {object} player 玩家对象
     * @param {object} block 方块对象
     * @returns 函数返回 false
     */
    onDestroyBlock(player, block) {

    }
    /**
     * 玩家打开容器方块
     * @param {player} player 玩家对象
     * @param {block} block 方块对象
     * @returns 函数返回 false
     */
    onOpenContainer(player, block) {
        player.tell("拦截");
        // return false;
    }
    /**
     * 发生由重生锚引起的爆炸
     * @param {FloatPos} pos 爆炸发生的重生锚的坐标
     * @param {player} player 试图使用重生锚的玩家
     * @returns 函数返回 false
     */
    onRespawnAnchorExplode(pos, player) {

    }
    /**
     * 发生由实体引起的爆炸
     * @param {Entity} source 爆炸来源的实体对象
     * @param {FloatPos} pos 爆炸发生的坐标
     * @param {Float} power 爆炸的威力值
     * @param {Float} range 爆炸的波及范围
     * @param {Boolean} isDestroy 爆炸是否破坏方块
     * @param {Boolean} isFire 爆炸是否产生火焰
     * @returns 函数返回 false
     */
    onExplode(source, pos, power, range, isDestroy, isFire) {

    }
    /**
     * 凋零破坏方块
     * @param {Entity} witherBoss 凋零的实体对象
     * @param {IntPos} AAbb 凋零将破坏的区域（长方体），对角点 A 坐标
     * @param {IntPos} aaBB 凋零将破坏的区域（长方体），对角点 B 坐标
     * @returns 函数返回 false
     */
    onWitherBossDestroy(witherBoss, AAbb, aaBB) {

    }
    /**
     * 发生由床引起的爆炸
     * @param {IntPos} 爆炸发生的床的坐标
     * @returns 函数返回 false
     */
    onBedExplode(pos) {

    }
    /**
     * 漏斗（漏斗矿车）检测可否吸取物品
     * @param {IntPos} pos 漏斗（漏斗矿车）所在的位置
     * @param {Boolean} isMinecart 是否为漏斗矿车
     * @returns 函数返回 false
     */
    onHopperSearchItem(pos, isMinecart) {

    }
    /**
     * 漏斗输出物品
     * @param {FloatPos} pos 漏斗所在的位置
     * @returns 函数返回 false
     */
    onHopperPushOut(pos) {

    }
    /**
     * 活塞推动
     * @param {IntPos} pistonPos 正在工作的活塞坐标
     * @param {Block} block 被推动的方块对象
     * @returns 函数返回 false
     */
    onPistonPush(pistonPos, block) {

    }
    /**
     * 玩家对方块使用物品（点击右键）
     * @param {Player} player 使用物品的玩家对象
     * @param {Item} item 被使用的物品对象
     * @param {block} block 被点击到的方块对象
     * @param {Number} side 方块被点击的面 依次为：0- 下 1- 上 2- 北 3- 南 4- 西 5- 东
     * @returns 函数返回 false
     */
    onUseItemOn(player, item, block, side) {

    }
}


/**
 * 常|变量配置
 */
const PluginsTitle = "NewLockBox";//插件标题
const PluginsName = PluginsTitle+".lxl.js";//插件文件名称
const PluginsV = 0.01;//插件版本
const PATH = ".\\plugins\\Yoyo\\" + PluginsTitle + "\\";
const InitConfig = JSON.stringify({
    money: {
        isLLmoney: true,//true 就是使用llmoney经济核心  false就是使用记分板
        socre: 'money'//记分板的记分项名称前提它得存在
    },
    defense: {
        minute: 1,//1分钟内
        destroyCount: 10,//规定时间内破坏达到多少次
        punish: {//处罚
            cmd: [],//执行多条命令
            kick: false,//是否执行完命令后踢出该玩家
            msg: '你恶意破坏其它玩家存储物,被系统踢出!'//踢出提示
        }
    },
    box: {
        max: 20,//每个玩家最大持有箱子数量
        eachBox: {
            type: 0,//0固定价格  1根据拥有数量递增 (count+1)*100
            price: 100//每次收费
        }
    },
    logger: {
        isConsole: true//是否把日志输出到控制台
    }
});
let isVersioning = false,versioning=null;

/**
 * 加载配置文件和数据库
 */

const CONFIG = new JsonConfigFile(`${PATH}config.json`, InitConfig);
const DB = new KVDatabase(`${PATH}database`);
logger.setConsole(CONFIG.get("logger").isConsole);
logger.setTitle(PluginsTitle);

/**
 * 实例化类
 */
const LockBoxClass = new LockBox();
/**
 * 监听事件
 */
mc.listen("onTick", () => { LockBoxClass.onTick() });
mc.listen("onServerStarted", () => { LockBoxClass.onServerStarted() });
mc.listen("onDestroyBlock", (player, block) => { return LockBoxClass.onDestroyBlock(player, block) });
mc.listen("onOpenContainer", (player, block) => { return LockBoxClass.onOpenContainer(player, block) });
mc.listen("onRespawnAnchorExplode", (pos, player) => { return LockBoxClass.onRespawnAnchorExplode(pos, player) });
mc.listen("onExplode", (source, pos, power, range, isDestroy, isFire) => { return LockBoxClass.onExplode(source, pos, power, range, isDestroy, isFire) });
mc.listen("onWitherBossDestroy", (witherBoss, AAbb, aaBB) => { return LockBoxClass.onWitherBossDestroy(witherBoss, AAbb, aaBB) });
mc.listen("onBedExplode", (pos) => { return LockBoxClass.onBedExplode(pos) });
mc.listen("onHopperSearchItem", (pos, isMinecart) => { return LockBoxClass.onHopperSearchItem(pos, isMinecart) });
mc.listen("onHopperPushOut", (pos) => { return LockBoxClass.onHopperPushOut(pos) });
mc.listen("onPistonPush", (pistonPos, block) => { return LockBoxClass.onPistonPush(pistonPos, block) });
mc.listen("onUseItemOn", (player, item, block, side) => { return LockBoxClass.onUseItemOn(player, item, block, side) });

/**
 * 注册命令
 */


/**
 * 导出接口
 */

/**
 * 导入接口
 */

// 远程更新配置接口
 isVersioning = lxl.require("pluginAutoUpdate.js","https://gitee.com/Y_oyo/yoyo-mcbe-lite-xloader-item/raw/master/pluginAutoUpdate.js");
 if(isVersioning){
    versioning = lxl.import("setAutoUpdate");
 }

